using System;
using System.Collections.Generic;
using System.Text;

namespace Sensor.UI.Protocols;

/// <summary>
/// 文本协议分包器（基于\r\n分隔符，以d0开头）
/// 单帧数据（格式：d0 x0 y0 z0 d1 x1 y1 z1 d2 x2 y2 z2 d3 x3 y3 z3\r\n）
/// </summary>
public class TextProtocolSplitter
{
    // 使用StringBuilder作为缓冲区，替代自定义环形缓冲区
    private readonly StringBuilder _buffer = new ();
    
    
    // 帧结束分隔符
    private const string FrameEndDelimiter = "\r\n";
    
    // 文本编码
    private readonly Encoding _encoding = Encoding.UTF8;

    /// <summary>
    /// 重置缓冲区
    /// </summary>
    public void Reset()
    {
        _buffer.Clear();
    }
    
    
    /// <summary>
    /// 处理新接收的字节流，返回完整的行数据（帧）
    /// 支持处理以\r\n结尾的文本帧
    /// </summary>
    /// <param name="data">新接收的数据</param>
    /// <returns>完整的帧列表</returns>
    public List<string> Process(byte[] data)
    {
        if (data == null || data.Length == 0)
        {
            return [];
        }

        // 将新数据添加到缓冲区
        string newData = _encoding.GetString(data);
        _buffer.Append(newData);

        List<string> completedFrames = [];
        string allData = _buffer.ToString();
        int rnIndex;

        // 循环提取所有以\r\n结尾的完整行，添加严格的边界检查
        while ((rnIndex = allData.IndexOf(FrameEndDelimiter)) != -1)
        {
            try
            {
                // 安全地提取完整行（不含\r\n）
                if (rnIndex >= 0 && rnIndex <= allData.Length)
                {
                    string line = allData[..rnIndex].Trim();
                    completedFrames.Add(line);
                }

                // 安全地更新allData为剩余未解析数据
                int nextStartIndex = rnIndex + FrameEndDelimiter.Length;
                if (nextStartIndex >= 0 && nextStartIndex <= allData.Length)
                {
                    allData = allData[nextStartIndex..];
                }
                else
                {
                    // 如果索引超出范围，清空allData以避免后续错误
                    allData = string.Empty;
                    break;
                }
            }
            catch (ArgumentOutOfRangeException)
            {
                // 如果发生索引越界异常，清空allData以避免无限循环
                allData = string.Empty;
                break;
            }
        }

        // 更新缓存为剩余未解析数据
        _buffer.Clear();
        _buffer.Append(allData);

        return completedFrames;
    }
   
}